package com.apps.globals.color.model.vo;

import com.apps.sexctption.DataException;
import com.apps.sexctption.NullException;
import com.apps.sutils.StringUtils;
import lombok.Data;

import java.util.HashMap;
import java.util.Map;

/**
 * rgb
 */
@Data
public class RGB {

    private int r;

    private int g;

    private int b;

    // 颜色标准（倍数关系）
    public static Map<Integer, String> colorStandard = new HashMap<Integer, String>();
    static {
        colorStandard.put(0, "00");
        colorStandard.put(1, "33");
        colorStandard.put(2, "66");
        colorStandard.put(3, "99");
        colorStandard.put(4, "cc");
        colorStandard.put(5, "ff");
    }

    public RGB()
    {

    }

    public RGB(int rgb)
    {
        this.r=(rgb & 0xff0000) >> 16;
        this.g=(rgb & 0xff00) >> 8;
        this.b=(rgb & 0xff);
    }
    public RGB(String rgb)
    {
      if(StringUtils.isEmpty(rgb))
         throw new NullException("字符串不能为空");
      String[] rgbs=rgb.split(",");
      if(rgbs.length!=3)
          throw new DataException("字符串"+rgb+"不合规则");
      this.r = Integer.valueOf(rgbs[0]);
      this.g = Integer.valueOf(rgbs[1]);
      this.b = Integer.valueOf(rgbs[2]);

    }

    public RGB(int r, int g, int b) {
        this.r = r;
        this.g = g;
        this.b = b;
    }

    /**
     * rgb转整数
     * @return
     */
    public int toInt()
    {
        return ((0xFF << 24)|(r << 16)|(g << 8)|b);
    }
    // 将十进制形式rgb转为符合标准颜色的十六进制字符串形式
    private String changeToHex() {
        // 颜色标准数（固定差值）
        float colorNum = 51.0f;
        // 通过颜色标准数计算颜色标准key
        int rk = Math.round(Float.parseFloat(r + "") / colorNum);
        int gk = Math.round(Float.parseFloat(g + "") / colorNum);
        int bk = Math.round(Float.parseFloat(b + "") / colorNum);
        // 通过颜色标准key取出标准颜色
        String rs = colorStandard.get(rk);
        String gs = colorStandard.get(gk);
        String bs = colorStandard.get(bk);
        return rs + gs + bs;
    }

    /**
     * 判断2个颜色是否相等
     * @param rgb
     * @return
     */
    public boolean equal(RGB rgb)
    {
        if(this.r == rgb.getR() && this.g == rgb.getG() && this.b == rgb.getB())
            return true;
        return false;
    }
}
